package com.note.feng.leetcode.algorithms.easy;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class TwoHundredFive {

    /**
     * 205 同构字符串
     * 给定两个字符串 s 和 t ，判断它们是否是同构的。
     *
     * 如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。
     *
     * 每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。不同字符不能映射到同一个字符上，
     * 相同字符只能映射到同一个字符上，字符可以映射到自己本身。
     *
     * 示例 1:
     *
     * 输入：s = "egg", t = "add"
     * 输出：true
     * 示例 2：
     *
     * 输入：s = "foo", t = "bar"
     * 输出：false
     * 示例 3：
     *
     * 输入：s = "paper", t = "title"
     * 输出：true
     *
     * 提示：
     *
     * 1 <= s.length <= 5 * 104
     * t.length == s.length
     * s 和 t 由任意有效的 ASCII 字符组成
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/isomorphic-strings
     */
    /**
     *解法：
     * 遍历对比：
     * 两个map，记录两个字符串的互相映射关系，若包含当前字符并且满足映射关系，继续遍历，否则返回false
     * @param s
     * @param t
     * @return
     */
    public boolean isIsomorphic(String s, String t) {
        Map<Character, Character> sMap = new HashMap<>();
        Map<Character, Character> tMap = new HashMap<>();
        for (int i = 0; i < s.length() ; i++) {
            Character ch = s.charAt(i);
            Character cht = t.charAt(i);
            if((sMap.containsKey(ch) && sMap.get(ch) != cht)
                    || (tMap.containsKey(cht) && tMap.get(cht) != ch)){
                return false;
            }
            sMap.put(ch, cht);
            tMap.put(cht, ch);
        }
        return true;
    }
}
